/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;
/**
 * @author Administrador.
 */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Acceso;
import com.javabeans.Menu;
import com.javabeans.SubMenu;
import com.javabeans.Opcion;

public class AdminAcceso implements AccesoManager{
    private Connection c;

    public AdminAcceso(Connection c){
        this.c = c;
    }
    
    @Override
    public List<Acceso> getAccesos(int idUsuario, int idRol) throws DataException{
        
        List<Acceso> accesos = new ArrayList<Acceso>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT M.URL URL_MENU, M.PADRE, A.IDUSUARIO, A.IDROL";
            query += ", O.IDMENU, O.IDSUBMENU, O.IDOPCION";
            query += ", O.NOMBRE, S.NOMBRE, M.NOMBRE";
            query += ", O.URL, S.URL";
            query += " FROM ACCESO A";
            query += " INNER JOIN OPCION O ON A.IDMENU=O.IDMENU AND A.IDSUBMENU=O.IDSUBMENU AND A.IDOPCION=O.IDOPCION";
            query += " INNER JOIN SUBMENU S ON O.IDMENU=S.IDMENU AND O.IDSUBMENU=S.IDSUBMENU";
            query += " INNER JOIN MENU M ON O.IDMENU=M.IDMENU";
            query += " WHERE A.IDUSUARIO="+idUsuario;
            query += " AND A.IDROL="+idRol;
            query += " ORDER BY M.ORDEN, S.ORDEN, O.ORDEN";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Opcion o = new Opcion();
                o.setIdMenu(rs.getInt("O.IDMENU"));
                o.setIdSubMenu(rs.getInt("O.IDSUBMENU"));
                o.setIdOpcion(rs.getInt("O.IDOPCION"));
                o.setNombre(rs.getString("O.NOMBRE"));
                o.setUrl(rs.getString("O.URL"));
                
                SubMenu s = new SubMenu();
                s.setIdMenu(o.getIdMenu());
                s.setIdSubMenu(o.getIdSubMenu());
                s.setNombre(rs.getString("S.NOMBRE"));
                s.setUrl(rs.getString("S.URL"));
                
                Menu m = new Menu();
                m.setIdMenu(s.getIdMenu());
                m.setNombre(rs.getString("M.NOMBRE"));
                m.setUrl(rs.getString("URL_MENU"));
                m.setPadre(rs.getBoolean("M.PADRE"));
                
                Acceso acceso = new Acceso();
                acceso.setIdUsuario(idUsuario);
                acceso.setIdRol(idRol);
                acceso.setIdMenu(m.getIdMenu());
                acceso.setIdSubMenu(s.getIdSubMenu());
                acceso.setIdOpcion(o.getIdOpcion());
                acceso.setOpcion(o);
                acceso.setSubMenu(s);
                acceso.setMenu(m);
                
                accesos.add(acceso);
            }
            
        }catch(SQLException e){
            throw new DataException(" AdminAcceso -> getAccesos(idUsuario, idRol) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return accesos;
    }
    
    /*==============================================================*/
    /* metodoque guarda varios usuarios                             */
    /*==============================================================*/
    @Override
    public void saveAccesos(List<Acceso> accesos) throws DataException{
        ResultSet rs = null;
        PreparedStatement preSt = null;
        int i = 0;
        String query = "INSERT INTO ACCESO VALUES";
        try{
            for(Acceso acceso : accesos){
                query += "("+acceso.getIdUsuario();
                query += ","+acceso.getIdRol()+","+acceso.getIdMenu();
                query += ","+acceso.getIdSubMenu()+","+acceso.getIdOpcion()+"),";
                i++;
            }
            if(i > 0){
                i = query.lastIndexOf(",");
                query = query.substring(0, i);
            }            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException("Error! saveAccesos(List<Acceso> accesos) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
    }

    @Override
    public void deleteAccesos(int idUsuario, int idRol) throws DataException {        
        PreparedStatement preSt = null;
        int i = 0;
        String query = "";
        try{
            query = "DELETE FROM ACCESO";
            query += " WHERE IDUSUARIO="+idUsuario+" AND IDROL="+idRol;            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException("Error! deleteAccesos(int idUsuario, int idRol) "+e.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
}
